﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#include "GcmpModel.h"
#include "ElementId.h"

namespace gcmp
{
    class IElement;
    class IGraphicsElementShape;

    struct GCMP_MODEL_EXPORT BodyValidityChecker
    {
        /// \brief  对文档中所有IBody拓扑关系和几何合法进行检测
        /// \param[in] pDoc 文档指针
        /// \param[out] errorMessage 输出的错误信息
        /// \return   true:文档中不存在不合法的body，反之则存在
        static bool ValidateBodiesLegalityOfDocument(const IDocument* pDoc,std::wstring & errorMessage);

        /// \brief  对Element集合中所有IBody拓扑关系和几何合法进行检测
        /// \param[in] pDoc elementsVec所处的文档
        /// \param[in] elementsVec 所要判断Body合法性的elements集合
        /// \param[out] errorMessage 输出的错误信息
        /// \return   true:Element集合中不存在不合法的body，反之则存在
        static bool ValidateBodiesLegalityOfElements(
            const IDocument* pDoc, 
            const std::vector<IElement*>& elementsVec,
            std::wstring& errorMessage
        );

        /// \brief  检测文档中的ModelShapeGrep是否存在surface指针
        /// 用于查找导致 https://pm.glodon.com/newjira/browse/GBMP-17848 等一系列空surface的根因
        /// \param[in] pDoc 文档指针
        /// \param[out] elementId 如果存在空surface，则返回第一个检测到的存在空指针的elementId
        /// \return True：通过检测，没有空surface指针；False：未通过检测，有空surface指针
        static bool ValidateSurfaceLegalityOfModelGrepOfDoc(const IDocument* pDoc,ElementId& elementId);

        /// \brief  检测Grep中是否存在空surface指针
        /// \param[in] pDoc 文档指针
        /// \param[in] IGraphicsElementShape Grep指针
        /// \return True：通过检测，没有空surface指针；False：未通过检测，有空surface指针
        static bool ValidateSurfaceLegalityOfGrep(const IDocument* pDoc, const IGraphicsElementShape* pGRep);
    };
}

